package com.example.java_gobang.controller;

import com.example.java_gobang.game.OnlineUserManager;
import com.example.java_gobang.mapper.UserInfoMapper;
import com.example.java_gobang.model.UserInfo;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpSession;
import org.apache.catalina.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserInfoMapper userInfoMapper;
    @Autowired
    private OnlineUserManager onlineUserManager;

    //用户登入
    @PostMapping("/login")
    public Object login(String userName, String password, HttpServletRequest request) {
        UserInfo userInfo = userInfoMapper.selectByName(userName);

        //判断输入的用户名和密码是否为空，再判断用户输入的用户名和密码是否正确
        if(userInfo == null || !userInfo.getPassword().equals(password)) {
            //不正确返回一个空的用户信息
            System.out.println("登录失败,用户名或密码错误!");
            return new UserInfo();
        }
        //当用户存在时，需要创建一个session方便后续登入
        HttpSession session = request.getSession(true);
        //true：session存在时，直接用原来的session，session不存在时，创建一个新的session
        session.setAttribute("userInfo", userInfo);
        System.out.println("登录成功！");
        return userInfo;
    }

    //用户注册
    @PostMapping("/register")
    public UserInfo register(String userName, String password) {
        //判断注册时输入的用户名和密码不能为空，并且插入的用户名不能与数据库中的用户名相同
        if(!StringUtils.hasLength(userName) || !StringUtils.hasLength(password)
           || userInfoMapper.selectByName(userName) != null) {
            System.out.println("用户名重复或者没有输入用户名和密码，导致注册失败!");
            return new UserInfo();
        }

        //创建用户信息对象
        UserInfo userInfo = new UserInfo();
        userInfo.setUserName(userName);
        userInfo.setPassword(password);


        try {
            //再将用户信息对象插入数据库当中
            userInfoMapper.insertUserInfo(userInfo);
        } catch (DuplicateKeyException e) {
            //如果(key)插入重复就会返回一个异常
            e.printStackTrace();
            return new UserInfo();
        }

        return userInfo;
    }


    //获取当前用户登入信息
    @GetMapping("/getUserInfo")
    public UserInfo getUserInfo(HttpServletRequest request) {
        //获取当前登入用户的session
        HttpSession session = request.getSession(false);
        //false: 如果登入了就会有session，没有登入就不会创建session

        //如果当前用户的session不存在，则代表未登录
        if(session == null) {
            System.out.println("session is null");
            return new UserInfo();
        }

        //session成功获取后，从session的Attribute中获取UserInfo对象，而不是在request中获取！！
        UserInfo userInfo = (UserInfo) session.getAttribute("userInfo");

        //需要拿到新的用户的session信息，因为进行游戏后，玩家的积分信息发生了改变,所以要向数据库中拿新的用户信息
        UserInfo newUserInfo = userInfoMapper.selectByName(userInfo.getUserName());
        return newUserInfo;
    }
}
